var xtools = {
	httpUrl: 'https://lmwa.cn/', //默认地址
	Default: '/static/logo.png', //默认地址
	Domain: 'https://lmwa.cn/', //域名-perfectUrl补全时使用
	liveCountdown: '',


	/*
	 * 田小檬常用方法库
	 * 用法 $xtools.方法名 或变量名
	 * 可在 @click 事件中直接使用
	 * 例如跳转：<view @click="$xtools.goNext('/pagesIndex/me/personalData')"><view>
	 */
	/* 获取系统信息 */
	/**
	 * 小檬-时间戳数据处理
	 * 传入对象后返回params参数用于快速整理请求或访问地址 可配合happenTimeFun使用获得当前格式好的时间
	 * 例如：this.$xtools.happenTimeFun(this.$xtools.getTime(),'YY年MM月DD日 h时m分s秒')
	 * @tutorial	https://code.lmwa.cn/archives/368.html
	 * @param 		{string} time 必传 需要转化的时间戳
	 * @param 		{string} format 非必传 需要被转化的时间 默认YY-MM-DD h:m:s
	 * @returns 	{String} 返回URL参数
	 */

	getTime() {
		let Time = new Date().getTime();
		return parseInt(Time / 1000) + '';
	},


	/* 地址相关 */
	/**
	 * 小檬-获取当前路径-可包括路径参数
	 * @tutorial	https://lmwa.cn 田小檬博客
	 * @tutorial	https://code.lmwa.cn 橙小檬分享
	 * @param		type 取值：query-只输出参数 queryObj-对象形式输出参数  route-只输出路径 其他值-输出完整路径
	 * @returns 	{String | Object} 地址或者参数对象
	 */
	getParams(type = 'queryObj') {
		let curPage = getCurrentPages();
		let route = curPage[curPage.length - 1].route; //获取当前页面的路由
		let params = curPage[curPage.length - 1].options; //获取当前页面参数，如果有则返回参数的对象，没有参数返回空对象{}
		let query = '';
		let keys = Object.keys(params); //获取对象的key 返回对象key的数组
		if (keys.length > 0) {
			query = keys.reduce((pre, cur) => {
				return pre + cur + '=' + params[cur] + '&';
			}, '?').slice(0, -1);
		}
		let currentPath;
		if (type == 'query') {
			currentPath = query;
		} else if (type == 'queryObj') {
			currentPath = this.StringQueryToObj(query);
		} else if (type == 'route') {
			currentPath = route;
		} else {
			currentPath = route + query;
		}
		return currentPath;
	},
	/**
	 * 小檬-获取当前路径的辅助函数-把query转化为对象形式
	 * @tutorial	https://lmwa.cn 田小檬博客
	 * @returns 	{String} 完整的路径参数
	 */
	StringQueryToObj(queryString) {
		const params = {};
		const pairs = queryString.slice(1).split("&");

		for (let i = 0; i < pairs.length; i++) {
			const pair = pairs[i].split("=");
			const key = decodeURIComponent(pair[0]);
			const value = decodeURIComponent(pair[1] || "");
			params[key] = value;
		}
		return params;
	},




	/**
	 * 小檬-延迟执行函数
	 * 获取或写入并读取缓存内容 填写v即写入并且获取结果 不填只获取
	 * @tutorial	https://lmwa.cn 田小檬博客
	 * @param		{function} fun 必传 需要 执行的函数
	 * @param		time String 非必传 延迟时间(单位ms)默认为1500ms
	 * @returns 	{String | boolean} void
	 */
	delays(fun, time = 1500) {
		setTimeout(fun, time);
	},


	/* 权限计算 */
	authority() {
		const READ = 0b1;
		const CREATE = 0b10;
		const UPDATE = 0b100;
		const DELETE = 0b1000;

		/* 运算时 */
		const xxx = READ | CREATE | UPDATE | DELETE

		console.log(xxx); /* 判断权限 */

		console.log(xxx & READ); /* 判断权限 */

		const yyy = xxx ^ READ /* 移除可读权限 */
		console.log(yyy);

		xxx

	},

	/* 计算 */

	//根据金纬度计算距离
	distance(lat1, lng1) {
		var that = this;
		if (!latitude || !longitude) {
			return 'N';
		}
		let lat2 = latitude;
		let lng2 = longitude;
		let rad1 = lat1 * Math.PI / 180.0;
		let rad2 = lat2 * Math.PI / 180.0;
		let a = rad1 - rad2;
		let b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
		let s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(rad1) *
			Math.cos(
				rad2) * Math.pow(
				Math.sin(b / 2), 2)));
		s = s * 6378.137;
		s = Math.round(s * 10000) / 10000;
		s = s.toString();
		s = s.substring(0, s.indexOf('.') + 3);
		console.log(s);
		return s
	},

	/* 预览图片 */
	/**
	 * 小檬-预览图片
	 * 传入图片地址或者数组即可
	 * @tutorial	https://lmwa.cn 田小檬博客
	 * @param		url String|Array 必传 
	 * @returns 	无返回值
	 */
	preview(url) {
		let urls;
		if (typeof(url) === "string") {
			urls = [url];
		} else {
			urls = url;
		}
		uni.previewImage({
			urls: urls,
			// longPressActions: {
			// 	itemList: ['发送给朋友', '保存图片', '收藏'],
			// 	success: function(data) {
			// 		console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片');
			// 	},
			// 	fail: function(err) {
			// 		console.log(err.errMsg);
			// 	}
			// }
		});
	},
	// 预览图片


	/* 缓存使用 */
	/**
	 * 小檬-缓存内容
	 * 获取或写入并读取缓存内容 填写v即写入并且获取结果 不填只获取
	 * @tutorial	https://lmwa.cn 田小檬博客
	 * @param		key String 必传 需要 读取/写入 缓存的缓存名称
	 * @param		value String 非必传 需要 写入 缓存的内容
	 * @returns 	{String | boolean} 若存在返回其值，不存在返回false
	 */
	get(key, value = '') {
		value && uni.setStorageSync(key, value)
		value = value || uni.getStorageSync(key);
		return value ? value : false
	},
	/**
	 * 小檬-读后即焚
	 * 读取后即可销毁
	 * @tutorial	https://lmwa.cn 田小檬博客
	 * @param  		key String 必传 需要读取缓存的缓存名称
	 * @returns 	{String | boolean} 若存在返回其值并且销毁，不存在返回false
	 */
	getRemove(key) {
		let v = uni.getStorageSync(key);
		v && this.remove(key);
		return v || false;
	},
	/**
	 * 小檬-销毁缓存 立即销毁缓存内容
	 * @tutorial	https://lmwa.cn 田小檬博客
	 * @param  		key String 必传 需要读取缓存的缓存名称
	 * @returns 	void 无任何返回值
	 */
	remove(key) {
		uni.removeStorageSync(key);
	},
	showtt: function(add1, add2) {
		uni.showToast({
			title: add1,
			duration: 2000,
			icon: add2 ? add2 : 'none'
		})
	},
	showload: function() {
		uni.showLoading({
			mask: true,
		})
	},

	/* 页面跳转 */

	/**
	 * 小檬-跳转下一页
	 * 可在 @click 事件中直接使用 
	 * 例如跳转：<view @click="$xtools.goNext('/pagesIndex/me/personalData')"><view>
	 * @tutorial	https://lmwa.cn/archives/917.html
	 * @param  		{String} gourl  必传 需要跳转的地址
	 * @returns 	void 无任何返回值，直接跳转
	 */
	goNext(gourl) {
		uni.navigateTo({
			url: gourl,
			fail: (res) => {
				console.log(res);
				uni.switchTab({
					url: gourl
				})

			}
		})
	},
	/**
	 * 小檬-返回上X页
	 * 可在 @click 事件中直接使用 
	 * 例如跳转：<view @click="$xtools.goNext('/pagesIndex/me/personalData')"><view>
	 * @tutorial	https://lmwa.cn/archives/917.html
	 * @param  		{number} num  非必传 需要返回的页数 默认返回上一页（即默认为1）
	 * @returns 	void 无任何返回值，直接跳转
	 */
	goBack(num = 1) {
		let curPage = getCurrentPages();
		console.log(curPage);
		var curPageNum = curPage.length; //当前页面栈总数
		if (curPageNum) {
			uni.navigateBack({
				delta: num
			})
		} else {
			/* H5被刷新了就无法返回，如果存在历史记录则返回到之前的历史记录 */
			// #ifdef H5
			history.back()
			// #endif
			// #ifdef APP-PLUS
			// APP就重启-APP几乎不可能被刷新所以此处几乎用不到
			setTimeout(() => {
				plus.runtime.restart();
			}, 10)
			// #endif

		}
		return;
	},
	/**
	 * 小檬-跳转tabar页面
	 * 可在 @click 事件中直接使用 
	 * 例如跳转：<view @click="$xtools.goTab('/pagesIndex/me/personalData')"><view>
	 * @tutorial	https://lmwa.cn/archives/917.html
	 * @param  		{number} url  必传 需要跳转的地址
	 * @returns 	void 无任何返回值，直接跳转
	 */
	goTab(url) {
		uni.switchTab({
			url: url
		})
	},
	/**
	 * 小檬-关闭所有页面，跳转到指定页面
	 * 可在 @click 事件中直接使用 
	 * 例如跳转：<view @click="$xtools.goAllClose('/pagesIndex/me/personalData')"><view>
	 * @tutorial	https://lmwa.cn/archives/917.html
	 * @param  		{number} url  必传 需要跳转的地址
	 * @returns 	void 无任何返回值，直接跳转
	 */
	goAllClose(url) {
		uni.reLaunch({
			url: url
		})
	},
	/**
	 * 小檬-关闭当前页，跳转下一页
	 * 可在 @click 事件中直接使用 
	 * 例如跳转：<view @click="$xtools.goClose('/pagesIndex/me/personalData')"><view>
	 * @tutorial	https://lmwa.cn/archives/917.html
	 * @param  		{number} url  必传 需要跳转的地址
	 * @returns 	void 无任何返回值，直接跳转
	 */
	goClose(url) {
		uni.redirectTo({
			url: url
		})
	},


	/* 数据转化 */
	/**
	 * 小檬-对象转params参数
	 * 传入对象后返回params参数用于快速整理请求或访问地址
	 * @tutorial	https://lmwa.cn/archives/917.html 田小檬博客
	 * @param		obj Object 必传 需要被转化的对象
	 */
	TxmToUrl(obj) {
		// const params = new URLSearchParams();
		// for (let key in obj) {
		// 	params.append(key, obj[key]);
		// }
		const params = Object.keys(obj).map(key => `${key}=${encodeURIComponent(obj[key])}`).join('&');
		console.log(params);
		return params;
	},


	/**
	 * 小檬-数组去重
	 * 获取或写入并读取缓存内容 填写v即写入并且获取结果 不填只获取
	 * @tutorial	https://lmwa.cn/archives/917.html 田小檬博客
	 * @param		{function} fun 必传 需要 执行的函数
	 * @param		time String 非必传 延迟时间(单位ms)默认为1500ms
	 * @returns 	{String | boolean} void
	 */
	RemoveRepetition(arr) {
		const result = [];
		for (var i = 0; i < arr.length; i++) {
			const item1 = arr[i]
			let isFind = false;
			for (var i = 0; i < result.length; i++) {
				const item2 = result[i]
				console.log(item2);
				// if (item1 === item2) {
				if (equals(item1, item2)) {
					isFind = true;
					break;
				}
			}
			if (!isFind) {
				result.push(item1);
			}
		}
		return result;
		/* 判断是原始值 */
		function isPrimitive(value) {
			return value === null || !['object', 'function'].includes(typeof value);
		}
		/* 判断是否重复 */
		function equals(value1, value2) {
			if (isPrimitive(value1) || isPrimitive(value2)) {
				return Object.is(value1, value2)
			}


			return 1;
			const entries1 = Object.entries(value1)
			const entries2 = Object.entries(value2)

			if (entries1.length !== entries2.length) {
				return false;
			}

			for (const [key, value] of entries1) {
				/* 递归调用判断是否重复 */
				// if(!equals(value,value2[key])){
				// 	return false;
				// }
			}

			return true;
		}

	},


	/**
	 * 小檬-对象转params参数
	 * 传入对象后返回params参数用于快速整理请求或访问地址
	 * @tutorial	https://lmwa.cn/archives/917.html
	 * @param 		{Object} obj 必传 需要被转化的对象
	 * @returns 	{String} 返回URL参数
	 */
	ToUrl(obj) {
		const params = Object.keys(obj).map(key => `${key}=${encodeURIComponent(obj[key])}`).join('&');
		return params;
	},

	/**
	 * 小檬-地址转化
	 * 传入http地址或base64 返回完整的地址
	 * @tutorial	https://lmwa.cn/archives/917.html
	 * @param 		{String} url
	 * @returns 	{String} 返回完整的URL地址
	 */
	perfectUrl(url = '') {
		if (!url) {
			url = this.Default;
		} else if (url.includes("base64") && url.includes("image")) {
			url = url;
		} else if (this.isBase64(url)) {
			url = 'data:image/jpeg;base64,' + url;
		} else if (!url.includes("http")) {
			url = this.Domain + url
		}
		// console.log(url);
		return url;
	},

	/**
	 * 小檬-手机号隐藏中间位数
	 * 传入对象后返回params参数用于快速整理请求或访问地址
	 * @tutorial	https://lmwa.cn/archives/917.html
	 * @param 		{string} str 必传 需要被转化的对象
	 * @returns 	{String} 返回URL参数
	 */
	noPassByMobile(str) {
		if (null != str && str != undefined) {
			var pat = /(\d{3})\d*(\d{4})/;
			return str.replace(pat, '$1****$2');
		} else {
			return "";
		}
	},
	/**
	 * 小檬-时间戳数据处理
	 * 传入对象后返回params参数用于快速整理请求或访问地址
	 * @tutorial	https://lmwa.cn/archives/917.html
	 * @param 		{string} time 必传 需要转化的时间戳
	 * @param 		{string} format 非必传 需要被转化的时间 默认YY-MM-DD h:m:s
	 * @returns 	{String} 返回URL参数
	 */
	happenTimeFun(time, format = 'YY-MM-DD h:m:s') {
		// console.log(format);
		if (time < 1000000000000) {
			time *= 1000
		}
		let date = new Date(time);
		//时间戳为10位需*1000，时间戳为13位的话不需乘1000
		let y = date.getFullYear();
		let MM = date.getMonth() + 1;
		MM = MM < 10 ? ('0' + MM) : MM; //月补0
		let d = date.getDate();
		d = d < 10 ? ('0' + d) : d; //天补0
		let h = date.getHours();
		h = h < 10 ? ('0' + h) : h; //小时补0
		let m = date.getMinutes();
		m = m < 10 ? ('0' + m) : m; //分钟补0
		let s = date.getSeconds();
		s = s < 10 ? ('0' + s) : s; //秒补0
		format = format.replace(/YY/g, y);
		format = format.replace(/MM/g, MM);
		format = format.replace(/DD/g, d);
		format = format.replace(/h/g, h);
		format = format.replace(/m/g, m);
		format = format.replace(/s/g, s);
		return format;
	},

	/**
	 * 小檬-获取开始时间--未完善
	 * 传入对象后返回params参数用于快速整理请求或访问地址
	 * @tutorial	https://lmwa.cn/archives/917.html
	 * @param 		{string} str 必传 需要被转化的对象
	 * @returns 	{String} 返回URL参数
	 */
	getLiveTimeCount: function(startTime) {
		if (startTime) { //如果设置了开始时间
			let $this = this;
			$this.liveCountTimes = setInterval(() => {
				//注：不论安卓还是ios，请将时间如 2020-02-02 20:20:20 转化为 2020/02/02 20:20:20 这种形式后再使用，否则无法转换，如下转换即可↓
				// let transedPreTime = startTime.replace(/-/g, '/') //这里转化时间格式为以/分隔形式
				let nowTime = new Date().getTime();
				let preTime = new Date(startTime).getTime()
				let obj = null;
				if (preTime - nowTime > 0) {
					let time = (preTime - nowTime) / 1000;
					let day = parseInt(time / (60 * 60 * 24));
					let hou = parseInt(time % (60 * 60 * 24) / 3600);
					let min = parseInt(time % (60 * 60 * 24) % 3600 / 60);
					let sec = parseInt(time % (60 * 60 * 24) % 3600 % 60);
					obj = {
						day: day < 10 ? '0' + day : day,
						hou: hou < 10 ? '0' + hou : hou,
						min: min < 10 ? '0' + min : min,
						sec: sec < 10 ? '0' + sec : sec
					};
					$this.liveCountdown = obj.day + '天' + obj.hou + '时' + obj.min + '分' + obj.sec + '秒'
					console.log($this.liveCountdown)
				} else {
					obj = {
						day: '00',
						hou: '00',
						min: '00',
						sec: '00'
					};
					$this.liveCountdown = obj.day + '天' + obj.hou + '时' + obj.min + '分' + obj.sec + '秒'
					console.log($this.liveCountdown);
					clearInterval($this.liveCountTimes)
				}
			}, 1000)
		} else {
			this.liveCountdown = "开始时间待定"
		}
	},

	/* 数据校验 */
	/**
	 * 小檬-判断是对象字段否存在 辅助函数 
	 * @tutorial	https://lmwa.cn/archives/917.html 田小檬博客
	 * @param		{Object} data 必传 需要被读取的对象
	 * @param		{String} key 必传 需要 对象键名的值
	 * @returns 	{String | boolean} 若存在返回其值，不存在返回false
	 */
	getobj(data, key) {
		if (data && data[key]) {
			return data[key];
		} else {
			return false;
		}
	},

	// from表单的输入
	formInfo(data) {
		let show = true
		for (let key in data) {
			const value = data[key]
			if (!value) {
				uni.showToast({
					title: '未填写完整',
					icon: 'none'
				})

				show = false;
				break;
			}
		}
		return show;
	},
	/**
	 * 小檬-判断是否是base64
	 */
	isBase64(str) {
		if (str === '' || str.trim() === '') {
			return false;
		}
		try {
			return btoa(atob(str)) == str;
		} catch (err) {
			return false;
		}
	},

	/**
	 * 小檬-判断身份证号
	 * @tutorial	https://lmwa.cn/archives/917.html
	 * @param		{String} idCard 必传 需要校验的身份证号码
	 * @param		{String | number} showtt 非必传 是否显示判断提示默认不显示
	 * @returns 	{boolean} 若正确返回true，不存在返回false
	 */
	IDCard(idCard, showtt = 0) {
		// 正则表达式校验身份证号码
		var regExp = /^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|1\d|2\d|3[01])\d{3}(\d|X|x)$/;

		// 判断身份证号码的格式是否正确
		if (!regExp.test(idCard)) {
			showtt && uni.showToast({
				title: '身份证号格式不正确!',
				icon: 'none'
			});
			return false;
		}

		// 校验身份证号码的最后一位校验码
		var factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
		var checkCodeList = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
		var checkCode = idCard.charAt(17).toUpperCase();
		var sum = 0;

		for (var i = 0; i < 17; i++) {
			sum += parseInt(idCard.charAt(i)) * factors[i];
		}

		var remainder = sum % 11;

		if (checkCode !== checkCodeList[remainder]) {
			showtt && uni.showToast({
				title: '身份证号校验码校验不通过!',
				icon: 'none'
			})
			return false;
		}
		showtt && uni.showToast({
			title: '身份证号验证通过!',
			icon: 'none'
		})
		return true;
	},
	/**
	 * 小檬-判断是否是手机号
	 * @tutorial	https://lmwa.cn/archives/917.html
	 * @param		{String} val 必传 需要校验的身份证号码
	 * @param		{String | number} showtt 非必传 是否显示判断提示默认不显示
	 * @returns 	{boolean} 若正确返回true，不存在返回false
	 */
	Phone(val, showtt = 0) {
		var patrn = /^(((1[3456789][0-9]{1})|(15[0-9]{1}))+\d{8})$/
		if (!patrn.test(val) || val === '') {
			showtt && uni.showToast({
				title: '手机号格式不正确',
				icon: 'none'
			})
			return false
		} else {
			showtt && uni.showToast({
				title: '手机号格式正确',
				icon: 'none'
			})
			return true
		}
	},
	/**
	 * 小檬-判断邮箱
	 * @tutorial	https://lmwa.cn/archives/917.html
	 * @param		{String} email 必传 需要校验的身份证号码
	 * @param		{String | number} showtt 非必传 是否显示判断提示默认不显示
	 * @returns 	{boolean} 若正确返回true，不存在返回false
	 */
	Email(email, showtt = 0) {
		if (email.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1) {
			showtt && uni.showToast({
				title: '邮箱格式正确',
				icon: 'none'
			})
			return true;
		} else {
			showtt && uni.showToast({
				title: '邮箱格式错误',
				icon: 'none'
			})
			return false;
		}
	},
	/**
	 * 小檬-判断是否是中文
	 * @tutorial	https://lmwa.cn/archives/917.html
	 * @param		{String} str 必传 需要校验的身份证号码
	 * @param		{String | number} showtt 非必传 是否显示判断提示默认不显示
	 * @returns 	{boolean} 若正确返回true，不存在返回false
	 */
	Chine: function(str, showtt = 0) {
		var reg = /^([u4E00-u9FA5]|[uFE30-uFFA0])*$/;
		if (reg.test(str)) {
			showtt && uni.showToast({
				title: '不是中文',
				icon: 'none'
			})
			return false;
		}
		showtt && uni.showToast({
			title: '是中文',
			icon: 'none'
		})
		return true;
	},
	/**
	 * 小檬-验证是否为图片
	 * @tutorial	https://lmwa.cn/archives/917.html
	 * @param		{String} fileName 必传 需要校验的身份证号码
	 * @param		{String | number} showtt 非必传 是否显示判断提示默认不显示
	 * @returns 	{boolean} 若正确返回true，不存在返回false
	 */
	CheckImage: function(fileName, showtt = 0) {
		let is = /(gif|jpg|jpeg|png|GIF|JPG|PNG)$/ig.test(fileName)

		showtt && uni.showToast({
			title: is ? '文件名是图片' : '文件名不是图片',
			icon: 'none'
		})
		return is;
	},
	/**
	 * 小檬-验证是否为视频
	 * @tutorial	https://lmwa.cn/archives/917.html
	 * @param		{String} fileName 必传 需要校验的身份证号码
	 * @param		{String | number} showtt 非必传 是否显示判断提示默认不显示
	 * @returns 	{boolean} 若正确返回true，不存在返回false
	 */
	CheckVideo: function(fileName) {
		return /(mp4|mp3|flv|wav)$/ig.test(fileName);
	},
	/**
	 * 小檬-判断密码是否符合 至少6位,包括大小写字母、数字、特殊字符，其中任意两种
	 * @tutorial	https://lmwa.cn/archives/917.html
	 * @param		{String} fileName 必传 需要校验的身份证号码
	 * @param		{String | number} showtt 非必传 是否显示判断提示默认不显示
	 * @returns 	{boolean} 若正确返回true，不存在返回false
	 */
	Password(val, showtt = 0) {
		// var reg = /^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)])+$)^.{8,16}$/;
		// var reg = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d|.*[\W_])$/;
		var reg = /(.*).{6,16}$/;
		let count = 0;
		if (/[a-z]/.test(val)) count++;
		if (/[A-Z]/.test(val)) count++;
		if (/\d/.test(val)) count++;
		if (/[\W_]/.test(val)) count++;
		if (val === '') {
			showtt && uni.showToast({
				title: '请输入密码',
				icon: 'none'
			})
		} else if (!reg.test(val) || count < 2) {
			showtt && uni.showToast({
				title: !reg.test(val) ? '密码请不少于6位' : '请包括大小写字母、数字、特殊字符，其中任意两种',
				icon: 'none'
			})
			return false
		} else {
			showtt && uni.showToast({
				title: '检验通过' + count,
				icon: 'none'
			})
			return true
		}
	},
}
export default xtools;